• R generation

https://rss.onlinelibrary.wiley.com/doi/10.1111/j.1740-9713.2018.01169.x

2 R zor şeyler için kolay, kolay şeyler için zor

R Syntax Comparison::CHEAT SHEET

https://www.amelia.mn/Syntax-cheatsheet.pdf


3 R paketleri

3.1 Neden paketler var



https://blog.mitchelloharawild.com/blog/user-2018-feature-wall/



3.2 Paketleri nereden bulabiliriz

3.3 Kendi paket evrenini oluştur


3.4 R için yardım bulma

  • Vignette


https://stackoverflow.com/

  • Google uygun anahtar kelime



http://cran.r-project.org/doc/contrib/Baggott-refcard-v2.pdf

https://www.rstudio.com/resources/cheatsheets/

  • Awesome R

https://github.com/qinwf/awesome-R#readme

https://awesome-r.com/

  • Twitter

https://twitter.com/hashtag/rstats?src=hash

  • Reproducible Examples

3.5 R paket yükleme

install.packages("tidyverse", dependencies = TRUE)
install.packages("jmv", dependencies = TRUE)
install.packages("questionr", dependencies = TRUE)
install.packages("Rcmdr", dependencies = TRUE)
install.packages("summarytools")

5 RStudio ile veri yükleme

https://support.rstudio.com/hc/en-us/articles/218611977-Importing-Data-with-RStudio


5.1 Excel

5.2 SPSS

5.3 csv


6 Veriyi görüntüleme

View(data)
data
head
tail
glimpse
str
skimr::skim()

7 Veriyi değiştirme

7.1 Veriyi kod ile değiştirelim

7.2 Veriyi eklentilerle değiştirme


7.3 RStudio aracılığıyla recode

questionr paketi kullanılacak


https://juba.github.io/questionr/articles/recoding_addins.html




8 Basit tanımlayıcı istatistikler

summary()
mean
median
min
max
sd
table()

8.1 summarytools

https://cran.r-project.org/web/packages/summarytools/vignettes/Introduction.html








8.2 skimr

library(skimr)
skim(df)

8.3 DataExplorer

library(DataExplorer)
DataExplorer::create_report(df)


8.4 Grafikler



descr(tobacco, style = 'rmarkdown')

print(descr(tobacco), method = 'render', table.classes = 'st-small')

dfSummary(tobacco, style = 'grid', plain.ascii = FALSE)

print(dfSummary(tobacco, graph.magnif = 0.75), method = 'render')



9 Rcmdr

library(Rcmdr)

Rcmdr::Commander()
  • A Comparative Review of the R Commander GUI for R

http://r4stats.com/articles/software-reviews/r-commander/


11 Sonraki Konular

  • RStudio ile GitHub
  • Hipotez testleri
  • R Markdown ve R Notebook ile tekrarlanabilir rapor

12 Diğer kodlar


13 Geri Bildirim




  1. Bu bir derlemedir, mümkün mertebe alıntılara referans vermeye çalıştım.

LS0tCnRpdGxlOiBSIGlsZSBhbmFsaXplIGJhxZ9sYXJrZW5eW0J1IGJpciBkZXJsZW1lZGlyLCBtw7xta8O8biBtZXJ0ZWJlIGFsxLFudMSxbGFyYSByZWZlcmFucwogIHZlcm1leWUgw6dhbMSxxZ90xLFtLl0KYXV0aG9yOiAiRGVybGV5ZW4gW1NlcmRhciBCYWxjxLEsIE1ELCBQYXRob2xvZ2lzdF0oaHR0cHM6Ly9zYmFsY2kuZ2l0aHViLmlvLykiCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSlgIgpvdXRwdXQ6CiAgcm1kZm9ybWF0czo6aHRtbF9kb2NjbzoKICAgIGhpZ2hsaWdodDoga2F0ZQogIGh0bWxfbm90ZWJvb2s6CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBoaWdobGlnaHQ6IGthdGUKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICc1JwogIGh0bWxfZG9jdW1lbnQ6IAogICAgZmlnX2NhcHRpb246IHllcwogICAga2VlcF9tZDogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA1CiAgICB0b2NfZmxvYXQ6IHllcwotLS0KCgpgYGB7ciBrbml0cl9pbml0LCBlY2hvPUZBTFNFLCBjYWNoZT1GQUxTRX0KbGlicmFyeShrbml0cikKbGlicmFyeShybWRmb3JtYXRzKQoKIyMgR2xvYmFsIG9wdGlvbnMKb3B0aW9ucyhtYXgucHJpbnQ9Ijc1IikKb3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwKICAgICAgICAgICAgICAgY2FjaGU9VFJVRSwKICAgICAgICAgICAgICAgcHJvbXB0PUZBTFNFLAogICAgICAgICAgICAgICB0aWR5PVRSVUUsCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsCiAgICAgICAgICAgICAgIG1lc3NhZ2U9RkFMU0UsCiAgICAgICAgICAgICAgIHdhcm5pbmc9RkFMU0UpCm9wdHNfa25pdCRzZXQod2lkdGg9NzUpCmBgYAoKCjwhLS0gT3BlbiBhbGwgbGlua3MgaW4gbmV3IHRhYi0tPiAgCjxiYXNlIHRhcmdldD0iX2JsYW5rIi8+ICAgCgoKPCEtLSBHbyB0byB3d3cuYWRkdGhpcy5jb20vZGFzaGJvYXJkIHRvIGN1c3RvbWl6ZSB5b3VyIHRvb2xzIC0tPiA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL3M3LmFkZHRoaXMuY29tL2pzLzMwMC9hZGR0aGlzX3dpZGdldC5qcyNwdWJpZD1yYS01YmMzNjkwMGE0MDUwOTBiIj4gIAo8L3NjcmlwdD4gCgoKCgpbIVtdKGh0dHA6Ly9yZXMuY2xvdWRpbmFyeS5jb20vZHlkOTExa21oL2ltYWdlL3VwbG9hZC9mX2F1dG8scV9hdXRvOmJlc3QvdjE1MzAxMTMwNzcvSW1hZ2VfMl92Znk0OGIucG5nKV0oaHR0cHM6Ly93d3cuZGF0YWNhbXAuY29tL2NvbW11bml0eS90dXRvcmlhbHMvZGF0YS1zY2llbmNlLXBpdGZhbGxzKQoKCi0gUiBnZW5lcmF0aW9uCgpodHRwczovL3Jzcy5vbmxpbmVsaWJyYXJ5LndpbGV5LmNvbS9kb2kvMTAuMTExMS9qLjE3NDAtOTcxMy4yMDE4LjAxMTY5LngKCgojIFIgecO8a2xlbWUKCmh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1YY0JMRVZrbnF2WQoKWyFbV2hhdCBpcyBSP10oaHR0cDovL2ltZy55b3V0dWJlLmNvbS92aS9YY0JMRVZrbnF2WS8wLmpwZyldKGh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1YY0JMRVZrbnF2WSkKCgojIyBSLXByb2plY3QKCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnLwoKLS0tCgpbIVtdKGh0dHBzOi8vaXNtYXljLmdpdGh1Yi5pby90YWxrcy9uZXNzLWluZmVyL2ltZy9lbmdpbmUucG5nKV0oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvc2xpZGVfZGVjay5odG1sIzYpCgotLS0KCiMjIFJTdHVkaW8KCmh0dHBzOi8vd3d3LnJzdHVkaW8uY29tLwoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcHJvZHVjdHMvcnN0dWRpby9kb3dubG9hZC8KCmh0dHBzOi8vbW9kZXJuZGl2ZS5jb20vMi1nZXR0aW5nLXN0YXJ0ZWQuaHRtbAoKLS0tCgpbIVtdKGh0dHA6Ly93d3ctdXNlcnMueW9yay5hYy51ay9+ZXIxMy9SU3R1ZGlvJTIwQW5hdG9teS5zdmcpXShodHRwczovL2J1enpyYmVlbGluZS5ibG9nLzIwMTgvMDcvMDQvcnN0dWRpby1hbmF0b215LykKCgoKLS0tCgojIyMgUlN0dWRpbyBla2xlbnRpbGVyaQoKLSBEaXNjb3ZlciBhbmQgaW5zdGFsbCB1c2VmdWwgUlN0dWRpbyBhZGRpbnMKCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9hZGRpbnNsaXN0L1JFQURNRS5odG1sCgpodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL3JzdHVkaW9hZGRpbnMvCgoKYGBge3J9CiMgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyc3R1ZGlvL2FkZGluZXhhbXBsZXMiLCB0eXBlID0gInNvdXJjZSIpCmBgYAoKCi0tLQoKIyMgWDExCgpodHRwczovL3d3dy54cXVhcnR6Lm9yZy8KCi0tLQoKIyMgSmF2YSBPUwoKaHR0cHM6Ly9zdXBwb3J0LmFwcGxlLmNvbS9rYi9kbDE1NzIKCi0tLQoKCiMgUiB6b3IgxZ9leWxlciBpw6dpbiBrb2xheSwga29sYXkgxZ9leWxlciBpw6dpbiB6b3IKCgotIFtSIG1ha2VzIGVhc3kgdGhpbmdzIGhhcmQsIGFuZCBoYXJkIHRoaW5ncyBlYXN5XShodHRwOi8vcjRzdGF0cy5jb20vYXJ0aWNsZXMvd2h5LXItaXMtaGFyZC10by1sZWFybi8pCgoKLSBBeW7EsSDFn2V5aSDDp29rIGZhemxhIMWfZWtpbGRlIHlhcG1hayBtw7xta8O8bgoKUiBTeW50YXggQ29tcGFyaXNvbjo6Q0hFQVQgU0hFRVQKCmh0dHBzOi8vd3d3LmFtZWxpYS5tbi9TeW50YXgtY2hlYXRzaGVldC5wZGYKCgoKLS0tCgoKIyBSIHBha2V0bGVyaQoKCiMjIE5lZGVuIHBha2V0bGVyIHZhcgoKWyFbXShodHRwczovL2lzbWF5Yy5naXRodWIuaW8vdGFsa3MvbmVzcy1pbmZlci9pbWcvYXBwc3RvcmUucG5nKV0oaHR0cHM6Ly9pc21heWMuZ2l0aHViLmlvL3RhbGtzL25lc3MtaW5mZXIvc2xpZGVfZGVjay5odG1sIzcpCgotLS0KCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD48YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5JIGxvdmUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+IGNvbW11bml0eS48YnI+U29tZW9uZSBpcyBsaWtlLCAmcXVvdDtvaCBoZXkgcGVlcHMsIEkgc2F3IGEgYmlnIG5lZWQgZm9yIHRoaXMgbXVuZGFuZSBidXQgZGlmZmljdWx0IHRhc2sgdGhhdCBJIGluZnJlcXVlbnRseSBkbywgc28gSSBjcmVhdGVkIGEgcGFja2FnZSB0aGF0IHdpbGwgbGl0ZXJhbGx5IHNjcmFwZSB0aGUgbGFzdCBiaXRzIG9mIHBlYW51dCBidXR0ZXIgb3V0IG9mIHRoZSBqYXIgZm9yIHlvdS4gSXQmIzM5O3MgY2FsbGVkIHBicGx5ci4mcXVvdDs8YnI+V2hhdCBhIHRyaWJlLjwvcD4mbWRhc2g7IEZyYW5rIEVsYXZza3kg4bSw4bWD4bWX4bWDIOG1guG2puG2u+G1g8qz4bWIIChARnJhbmtseV9EYXRhKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0ZyYW5rbHlfRGF0YS9zdGF0dXMvMTAxNDE4OTA5NTI5NDI5MTk2OD9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5KdWx5IDMsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPgoKLS0tCgoKCmh0dHBzOi8vYmxvZy5taXRjaGVsbG9oYXJhd2lsZC5jb20vYmxvZy91c2VyLTIwMTgtZmVhdHVyZS13YWxsLwoKLS0tCgohW10oaHR0cHM6Ly9ibG9nLm1pdGNoZWxsb2hhcmF3aWxkLmNvbS9ibG9nLzIwMTgtMDctMTEtdXNlci0yMDE4LWZlYXR1cmUtd2FsbF9maWxlcy9maW5hbC5qcGcpCgotLS0KCiMjIFBha2V0bGVyaSBuZXJlZGVuIGJ1bGFiaWxpcml6CgotIEF2YWlsYWJsZSBDUkFOIFBhY2thZ2VzIEJ5IE5hbWUgIApodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvYXZhaWxhYmxlX3BhY2thZ2VzX2J5X25hbWUuaHRtbAoKLSBCaW9jb25kdWN0b3IgIApodHRwczovL3d3dy5iaW9jb25kdWN0b3Iub3JnCgotIFJlY29tbWVuZFIgIApodHRwOi8vcmVjb21tZW5kci5pbmZvLwoKLSBwa2dzZWFyY2ggIApDUkFOIHBhY2thZ2Ugc2VhcmNoICAKaHR0cHM6Ly9naXRodWIuY29tL21ldGFjcmFuL3BrZ3NlYXJjaAoKLSBBd2Vzb21lIFIgIApodHRwczovL2F3ZXNvbWUtci5jb20vICAKCgojIyBLZW5kaSBwYWtldCBldnJlbmluaSBvbHXFn3R1cgoKLSBwa2d2ZXJzZTogQnVpbGQgYSBNZXRhLVBhY2thZ2UgVW5pdmVyc2UgIApodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcGtndmVyc2UvaW5kZXguaHRtbAoKCgotLS0KCiMjIFIgacOnaW4geWFyZMSxbSBidWxtYQoKCmBgYHtyIHlhcmTEsW19CiMgP21lYW4KIyA/P2VmZXRjaAojIGhlbHAobWVyZ2UpCiMgZXhhbXBsZShtZXJnZSkKYGBgCgoKCi0gVmlnbmV0dGUKCiFbXShmaWd1cmVzL3ZpZ25ldHRlLnBuZykKCi0tLQoKLSBSRG9jdW1lbnRhdGlvbgpodHRwczovL3d3dy5yZG9jdW1lbnRhdGlvbi5vcmcKCi0gUiBQYWNrYWdlIERvY3VtZW50YXRpb24KaHR0cHM6Ly9yZHJyLmlvLwoKLSBHaXRIdWIKCi0gU3RhY2tvdmVyZmxvdwoKaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS8KCi0gR29vZ2xlIHV5Z3VuIGFuYWh0YXIga2VsaW1lCgoKCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD48YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5Ib3cgSSB1c2UgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0cz9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0czwvYT4gPGJyPmgvdCA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1RoZVByYWN0aWNhbERldj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5AVGhlUHJhY3RpY2FsRGV2PC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vZXJSblRHMFVqciI+cGljLnR3aXR0ZXIuY29tL2VyUm5URzBVanI8L2E+PC9wPiZtZGFzaDsgRW1pbHkgQm92ZWUgKEBlYm92ZWUwOSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9lYm92ZWUwOS9zdGF0dXMvMTAyODAzNzU5NDk0NzQ4NTY5Nj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5BdWd1c3QgMTAsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPgoKCi0tLQoKCiFbXShmaWd1cmVzL0dvb2dsZS1wYWNrYWdlLW5hbWUucG5nKQoKLS0tCgoKCiFbXShmaWd1cmVzL0dvb2dsZS1zdGFydC13aXRoLVIucG5nKQoKLS0tCgotIEF3ZXNvbWUgQ2hlYXRzaGVldApodHRwczovL2dpdGh1Yi5jb20vZGV0YWlseWFuZy9hd2Vzb21lLWNoZWF0c2hlZXQKCmh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmcvZG9jL2NvbnRyaWIvQmFnZ290dC1yZWZjYXJkLXYyLnBkZgoKaHR0cHM6Ly93d3cucnN0dWRpby5jb20vcmVzb3VyY2VzL2NoZWF0c2hlZXRzLwoKCi0gQXdlc29tZSBSCgpodHRwczovL2dpdGh1Yi5jb20vcWlud2YvYXdlc29tZS1SI3JlYWRtZQoKaHR0cHM6Ly9hd2Vzb21lLXIuY29tLwoKCgoKLSBUd2l0dGVyCgpodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoCgoKLSBSZXByb2R1Y2libGUgRXhhbXBsZXMKCjxibG9ja3F1b3RlIGNsYXNzPSJ0d2l0dGVyLXR3ZWV0IiBkYXRhLWxhbmc9ImVuIj48cCBsYW5nPSJlbiIgZGlyPSJsdHIiPkdvdCBhIHF1ZXN0aW9uIHRvIGFzayBvbiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL1NsYWNrSFE/cmVmX3NyYz10d3NyYyU1RXRmdyI+QFNsYWNrSFE8L2E+IG9yIHBvc3Qgb24gPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9naXRodWI/cmVmX3NyYz10d3NyYyU1RXRmdyI+QGdpdGh1YjwvYT4/IE5vIHRpbWUgdG8gcmVhZCB0aGUgbG9uZyBwb3N0IG9uIGhvdyB0byB1c2UgcmVwcmV4PyBIZXJlIGlzIGEgMjAtc2Vjb25kIGdpZiBmb3IgeW91IHRvIGZvcm1hdCB5b3VyIFIgY29kZXMgbmljZWx5IGFuZCBmb3Igb3RoZXJzIHRvIHJlcHJvZHVjZSB5b3VyIHByb2JsZW0uIChBbiBleGFtcGxlIGZyb20gYSB0YWxrIGdpdmVuIGJ5IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vSmVubnlCcnlhbj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5ASmVubnlCcnlhbjwvYT4pIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdD9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I3JzdGF0PC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vZ3B1R1hwRklzWCI+cGljLnR3aXR0ZXIuY29tL2dwdUdYcEZJc1g8L2E+PC9wPiZtZGFzaDsgWmhpWWFuZyAoQHpoaWlpeWFuZykgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS96aGlpaXlhbmcvc3RhdHVzLzEwNTMwMDYwMDM3MTE1Njk5MjA/cmVmX3NyYz10d3NyYyU1RXRmdyI+T2N0b2JlciAxOCwgMjAxODwvYT48L2Jsb2NrcXVvdGU+PHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vcGxhdGZvcm0udHdpdHRlci5jb20vd2lkZ2V0cy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgoKCgoKCi0tLQoKIyMgUiBwYWtldCB5w7xrbGVtZQoKYGBgCmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoImptdiIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoInF1ZXN0aW9uciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCmluc3RhbGwucGFja2FnZXMoIlJjbWRyIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKaW5zdGFsbC5wYWNrYWdlcygic3VtbWFyeXRvb2xzIikKYGBgCgpgYGB7ciBwYWtldCB5w7xrbGVtZX0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQojIGluc3RhbGwucGFja2FnZXMoImptdiIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygicXVlc3Rpb25yIiwgZGVwZW5kZW5jaWVzID0gVFJVRSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJSY21kciIsIGRlcGVuZGVuY2llcyA9IFRSVUUpCiMgaW5zdGFsbC5wYWNrYWdlcygic3VtbWFyeXRvb2xzIikKYGBgCgoKYGBge3IgcGFrZXQgY2FnaXJtYSwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBldmFsID0gVFJVRSwgaW5jbHVkZSA9IFRSVUV9CiMgcmVxdWlyZSh0aWR5dmVyc2UpCiMgcmVxdWlyZShqbXYpCiMgcmVxdWlyZShxdWVzdGlvbnIpCiMgbGlicmFyeShzdW1tYXJ5dG9vbHMpCiMgbGlicmFyeShnZ2FuaW1hdGUpCmBgYAoKLS0tCgojIFIgc3R1ZGlvIGlsZSBwcm9qZSBvbHXFn3R1cm1hCgpodHRwczovL3N1cHBvcnQucnN0dWRpby5jb20vaGMvZW4tdXMvYXJ0aWNsZXMvMjAwNTI2MjA3LVVzaW5nLVByb2plY3RzCgohW10oaHR0cDovL3d3dy5yc3R1ZGlvLmNvbS9pbWFnZXMvZG9jcy9wcm9qZWN0c19uZXcucG5nKQoKLS0tCgojIFJTdHVkaW8gaWxlIHZlcmkgecO8a2xlbWUKCmh0dHBzOi8vc3VwcG9ydC5yc3R1ZGlvLmNvbS9oYy9lbi11cy9hcnRpY2xlcy8yMTg2MTE5NzctSW1wb3J0aW5nLURhdGEtd2l0aC1SU3R1ZGlvCgohW10oaHR0cHM6Ly9zdXBwb3J0LnJzdHVkaW8uY29tL2hjL2VuLXVzL2FydGljbGVfYXR0YWNobWVudHMvMjA2Mjc3NjE4L2RhdGEtaW1wb3J0LW92ZXJ2aWV3LmdpZikKCi0tLQoKIyMgRXhjZWwKCiMjIFNQU1MKCiMjIGNzdgoKCi0tLQoKIyBWZXJpeWkgZ8O2csO8bnTDvGxlbWUKCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3BsYXRmb3JtLnR3aXR0ZXIuY29tL3dpZGdldHMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD48YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5TcHJlYWRzaGVldCB1c2VycyB1c2luZyA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPjogIHdoZXJlJiMzOTtzIHRoZSBkYXRhPzxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9yc3RhdHM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHM8L2E+IHVzZXJzIHVzaW5nIHNwcmVhZHNoZWV0czogIHdoZXJlJiMzOTtzIHRoZSBjb2RlPzwvcD4mbWRhc2g7IExlb25hcmQgS2llZmVyIChAbGVua2llZmVyKSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2xlbmtpZWZlci9zdGF0dXMvMTAxNTU4NzQ3NTU4MDk1NjY3Mj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5KdWx5IDcsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPgoKCgpgYGB7ciwgcmVzdWx0cz0ibWFya3VwIn0KIyBsaWJyYXJ5KG55Y2ZsaWdodHMxMykKIyBzdW1tYXJ5KGZsaWdodHMpCmBgYAoKCgpgYGAKVmlldyhkYXRhKQpgYGAKCgpgYGAKZGF0YQpgYGAKCgpgYGAKaGVhZApgYGAKCgpgYGAKdGFpbApgYGAKCgpgYGAKZ2xpbXBzZQpgYGAKCgpgYGAKc3RyCmBgYAoKCmBgYApza2ltcjo6c2tpbSgpCmBgYAoKLS0tCgoKIyBWZXJpeWkgZGXEn2nFn3Rpcm1lCgojIyBWZXJpeWkga29kIGlsZSBkZcSfacWfdGlyZWxpbQoKIyMgVmVyaXlpIGVrbGVudGlsZXJsZSBkZcSfacWfdGlybWUKCiFbXShmaWd1cmVzL2NoYW5nZV9kYXRhLnBuZykKCgotLS0KCgojIyBSU3R1ZGlvIGFyYWPEsWzEscSfxLF5bGEgcmVjb2RlCgoqcXVlc3Rpb25yKiBwYWtldGkga3VsbGFuxLFsYWNhawoKIVtdKGZpZ3VyZXMvbGV2ZWxfcmVjb2RlLnBuZykKCgotLS0KCgoKaHR0cHM6Ly9qdWJhLmdpdGh1Yi5pby9xdWVzdGlvbnIvYXJ0aWNsZXMvcmVjb2RpbmdfYWRkaW5zLmh0bWwKCgohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2p1YmEvcXVlc3Rpb25yL21hc3Rlci9yZXNvdXJjZXMvc2NyZWVuc2hvdHMvaXJlY18xLnBuZykKCgotLS0KCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vanViYS9xdWVzdGlvbnIvbWFzdGVyL3Jlc291cmNlcy9zY3JlZW5zaG90cy9pcmVjXzIucG5nKQoKCi0tLQoKIVtdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9qdWJhL3F1ZXN0aW9uci9tYXN0ZXIvcmVzb3VyY2VzL3NjcmVlbnNob3RzL2lyZWNfMy5wbmcpCgoKLS0tCgojIEJhc2l0IHRhbsSxbWxhecSxY8SxIGlzdGF0aXN0aWtsZXIKCmBgYApzdW1tYXJ5KCkKYGBgCgpgYGAKbWVhbgpgYGAKCmBgYAptZWRpYW4KYGBgCgpgYGAKbWluCmBgYAoKYGBgCm1heApgYGAKCmBgYApzZApgYGAKCmBgYAp0YWJsZSgpCmBgYAoKCmBgYHtyIGRlc2NyaXB0aXZlLCBlY2hvPVRSVUUsIGluY2x1ZGUgPSBUUlVFfQpsaWJyYXJ5KHJlYWRyKQppcmlzZGF0YSA8LSByZWFkX2NzdigiZGF0YS9pcmlzLmNzdiIpCgpqbXY6OmRlc2NyaXB0aXZlcygKICAgIGRhdGEgPSBpcmlzZGF0YSwKICAgIHZhcnMgPSAiU2VwYWwuTGVuZ3RoIiwKICAgIHNwbGl0QnkgPSAiU3BlY2llcyIsCiAgICBmcmVxID0gVFJVRSwKICAgIGhpc3QgPSBUUlVFLAogICAgZGVucyA9IFRSVUUsCiAgICBiYXIgPSBUUlVFLAogICAgYm94ID0gVFJVRSwKICAgIHZpb2xpbiA9IFRSVUUsCiAgICBkb3QgPSBUUlVFLAogICAgbW9kZSA9IFRSVUUsCiAgICBzdW0gPSBUUlVFLAogICAgc2QgPSBUUlVFLAogICAgdmFyaWFuY2UgPSBUUlVFLAogICAgcmFuZ2UgPSBUUlVFLAogICAgc2UgPSBUUlVFLAogICAgc2tldyA9IFRSVUUsCiAgICBrdXJ0ID0gVFJVRSwKICAgIHF1YXJ0ID0gVFJVRSwKICAgIHBjRXFHciA9IFRSVUUpCmBgYAoKLS0tCgpgYGB7ciBzY2F0dGVyLCBlY2hvPVRSVUUsIGluY2x1ZGU9VFJVRX0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzY2F0ciIpCgpzY2F0cjo6c2NhdCgKICAgIGRhdGEgPSBpcmlzZGF0YSwKICAgIHggPSAiU2VwYWwuTGVuZ3RoIiwKICAgIHkgPSAiU2VwYWwuV2lkdGgiLAogICAgZ3JvdXAgPSAiU3BlY2llcyIsCiAgICBtYXJnID0gImRlbnMiLAogICAgbGluZSA9ICJsaW5lYXIiLAogICAgc2UgPSBUUlVFKQoKYGBgCgojIyBzdW1tYXJ5dG9vbHMKCmh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9zdW1tYXJ5dG9vbHMvdmlnbmV0dGVzL0ludHJvZHVjdGlvbi5odG1sCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpsaWJyYXJ5KHN1bW1hcnl0b29scykKc3VtbWFyeXRvb2xzOjpmcmVxKGlyaXMkU3BlY2llcywgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQpzdW1tYXJ5dG9vbHM6OmZyZXEoaXJpcyRTcGVjaWVzLCByZXBvcnQubmFzID0gRkFMU0UsIHN0eWxlID0gInJtYXJrZG93biIsIG9taXQuaGVhZGluZ3MgPSBUUlVFKQpgYGAKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CndpdGgodG9iYWNjbywgcHJpbnQoY3RhYmxlKHNtb2tlciwgZGlzZWFzZWQpLCBtZXRob2QgPSAncmVuZGVyJykpCmBgYAoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CndpdGgodG9iYWNjbywgCiAgICAgcHJpbnQoY3RhYmxlKHNtb2tlciwgZGlzZWFzZWQsIHByb3AgPSAnbicsIHRvdGFscyA9IEZBTFNFKSwgCiAgICAgICAgICAgb21pdC5oZWFkaW5ncyA9IFRSVUUsIG1ldGhvZCA9ICJyZW5kZXIiKSkKYGBgCgoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnN1bW1hcnl0b29sczo6ZGVzY3IoaXJpcywgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgoKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CmRlc2NyKGlyaXMsIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpLCB0cmFuc3Bvc2UgPSBUUlVFLCAKICAgICAgb21pdC5oZWFkaW5ncyA9IFRSVUUsIHN0eWxlID0gInJtYXJrZG93biIpCmBgYAoKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQojIHZpZXcoZGZTdW1tYXJ5KGlyaXMpKQoKYGBgCgoKIVtdKGZpZ3VyZXMvZGZzdW1tYXJ5LnBuZykKCgoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KZGZTdW1tYXJ5KHRvYmFjY28sIHBsYWluLmFzY2lpID0gRkFMU0UsIHN0eWxlID0gImdyaWQiKQpgYGAKCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQoKIyBGaXJzdCBzYXZlIHRoZSByZXN1bHRzCgppcmlzX3N0YXRzX2J5X3NwZWNpZXMgPC0gYnkoZGF0YSA9IGlyaXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESUNFUyA9IGlyaXMkU3BlY2llcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBkZXNjciwgc3RhdHMgPSBjKCJtZWFuIiwgInNkIiwgIm1pbiIsICJtZWQiLCAibWF4IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3NlID0gVFJVRSkKCiMgVGhlbiB1c2UgdmlldygpLCBsaWtlIHNvOgoKdmlldyhpcmlzX3N0YXRzX2J5X3NwZWNpZXMsIG1ldGhvZCA9ICJwYW5kZXIiLCBzdHlsZSA9ICJybWFya2Rvd24iKQpgYGAKCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CiMgdmlldyhpcmlzX3N0YXRzX2J5X3NwZWNpZXMpCmBgYAoKIVtdKGZpZ3VyZXMvRGVzY3JpcHRpdmVTdGF0aXN0aWNzLnBuZykKCi0tLQoKYGBge3IsIGluY2x1ZGU9VFJVRSwgY29tbWVudD1OQSwgcHJvbXB0PUZBTFNFLCBjYWNoZT1GQUxTRSwgZWNobz1UUlVFLCByZXN1bHRzPSdhc2lzJ30KZGF0YSh0b2JhY2NvKSAjIHRvYmFjY28gaXMgYW4gZXhhbXBsZSBkYXRhZnJhbWUgaW5jbHVkZWQgaW4gdGhlIHBhY2thZ2UKQk1JX2J5X2FnZSA8LSB3aXRoKHRvYmFjY28sIAogICAgICAgICAgICAgICAgICAgYnkoQk1JLCBhZ2UuZ3IsIGRlc2NyLCAKICAgICAgICAgICAgICAgICAgICAgIHN0YXRzID0gYygibWVhbiIsICJzZCIsICJtaW4iLCAibWVkIiwgIm1heCIpKSkKdmlldyhCTUlfYnlfYWdlLCAicGFuZGVyIiwgc3R5bGUgPSAicm1hcmtkb3duIikKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CkJNSV9ieV9hZ2UgPC0gd2l0aCh0b2JhY2NvLCAKICAgICAgICAgICAgICAgICAgIGJ5KEJNSSwgYWdlLmdyLCBkZXNjciwgIHRyYW5zcG9zZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1lZCIsICJtYXgiKSkpCgp2aWV3KEJNSV9ieV9hZ2UsICJwYW5kZXIiLCBzdHlsZSA9ICJybWFya2Rvd24iLCBvbWl0LmhlYWRpbmdzID0gVFJVRSkKYGBgCgotLS0KCmBgYHtyLCBpbmNsdWRlPVRSVUUsIGNvbW1lbnQ9TkEsIHByb21wdD1GQUxTRSwgY2FjaGU9RkFMU0UsIGVjaG89VFJVRSwgcmVzdWx0cz0nYXNpcyd9CnRvYmFjY29fc3Vic2V0IDwtIHRvYmFjY29bICxjKCJnZW5kZXIiLCAiYWdlLmdyIiwgInNtb2tlciIpXQpmcmVxX3RhYmxlcyA8LSBsYXBwbHkodG9iYWNjb19zdWJzZXQsIGZyZXEpCgojIHZpZXcoZnJlcV90YWJsZXMsIGZvb3Rub3RlID0gTkEsIGZpbGUgPSAnZnJlcS10YWJsZXMuaHRtbCcpCmBgYAoKLS0tCgpgYGB7ciwgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BLCBwcm9tcHQ9RkFMU0UsIGNhY2hlPUZBTFNFLCBlY2hvPVRSVUUsIHJlc3VsdHM9J2FzaXMnfQp3aGF0LmlzKGlyaXMpCmBgYAoKLS0tCgpgYGB7cn0KZnJlcSh0b2JhY2NvJGdlbmRlciwgc3R5bGUgPSAncm1hcmtkb3duJykKYGBgCgotLS0KCmBgYHtyfQpwcmludChmcmVxKHRvYmFjY28kZ2VuZGVyKSwgbWV0aG9kID0gJ3JlbmRlcicpCmBgYAoKLS0tCgojIyBza2ltcgoKYGBgCmxpYnJhcnkoc2tpbXIpCnNraW0oZGYpCmBgYAoKLS0tCgojIyBEYXRhRXhwbG9yZXIKCmBgYApsaWJyYXJ5KERhdGFFeHBsb3JlcikKRGF0YUV4cGxvcmVyOjpjcmVhdGVfcmVwb3J0KGRmKQpgYGAKCgpbIVtdKGh0dHBzOi8vc3RhdGljMS5zcXVhcmVzcGFjZS5jb20vc3RhdGljLzU4ZWVmODg0NmE0OTYzZTQyOTY4N2E0ZC90LzViZGZjMmZiNGQ3YTljMDRlZTUwYjdhYS8xNTQxMzkxMTYwNzAyL2RhdGFFeHBsb3JlckdpZkxnLmdpZj9mb3JtYXQ9MTUwMHcpXShodHRwczovL3d3dy5saXR0bGVtaXNzZGF0YS5jb20vYmxvZy9zaW1wbGUtZWRhKQoKCgotLS0KCiMjIEdyYWZpa2xlcgoKYGBge3J9CiMgbGlicmFyeShnZ3Bsb3QyKQojIGxpYnJhcnkobW9zYWljKQojIG1QbG90KGlyaXNkYXRhKQpgYGAKCi0tLQoKYGBge3J9CmN0YWJsZSh0b2JhY2NvJGdlbmRlciwgdG9iYWNjbyRzbW9rZXIsIHN0eWxlID0gJ3JtYXJrZG93bicpCmBgYAoKLS0tCgpgYGB7cn0KcHJpbnQoY3RhYmxlKHRvYmFjY28kZ2VuZGVyLCB0b2JhY2NvJHNtb2tlciksIG1ldGhvZCA9ICdyZW5kZXInKQpgYGAKCmBgYApkZXNjcih0b2JhY2NvLCBzdHlsZSA9ICdybWFya2Rvd24nKQoKcHJpbnQoZGVzY3IodG9iYWNjbyksIG1ldGhvZCA9ICdyZW5kZXInLCB0YWJsZS5jbGFzc2VzID0gJ3N0LXNtYWxsJykKCmRmU3VtbWFyeSh0b2JhY2NvLCBzdHlsZSA9ICdncmlkJywgcGxhaW4uYXNjaWkgPSBGQUxTRSkKCnByaW50KGRmU3VtbWFyeSh0b2JhY2NvLCBncmFwaC5tYWduaWYgPSAwLjc1KSwgbWV0aG9kID0gJ3JlbmRlcicpCmBgYAoKCi0tLQoKCgo8YmxvY2txdW90ZSBjbGFzcz0idHdpdHRlci10d2VldCIgZGF0YS1sYW5nPSJlbiI+PHAgbGFuZz0iZW4iIGRpcj0ibHRyIj5IZXJlLCBidWlsZGluZyB1cCBhIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9nZ3Bsb3QyP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jZ2dwbG90MjwvYT4gYXMgc2xvd2x5IGFzIHBvc3NpYmxlLCA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvcnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jcnN0YXRzPC9hPi4gIEluY3JlbWVudGFsIGFkanVzdG1lbnRzLiAgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnL3JzdGF0c3RlYWNoaW5naWRlYXM/c3JjPWhhc2gmYW1wO3JlZl9zcmM9dHdzcmMlNUV0ZnciPiNyc3RhdHN0ZWFjaGluZ2lkZWFzPC9hPiA8YSBocmVmPSJodHRwczovL3QuY28vblV1bFFsOGJQaCI+cGljLnR3aXR0ZXIuY29tL25VdWxRbDhiUGg8L2E+PC9wPiZtZGFzaDsgR2luYSBSZXlub2xkcyAoQEV2YU1hZVJleSkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9FdmFNYWVSZXkvc3RhdHVzLzEwMjkxMDQ2NTY3NjM1NzIyMjY/cmVmX3NyYz10d3NyYyU1RXRmdyI+QXVndXN0IDEzLCAyMDE4PC9hPjwvYmxvY2txdW90ZT48c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoKLS0tCgoKWyFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZHJlYW1Scy9lc3F1aXNzZS9tYXN0ZXIvbWFuL2ZpZ3VyZXMvZXNxdWlzc2UuZ2lmKV0oaHR0cHM6Ly9naXRodWIuY29tL2RyZWFtUnMvZXNxdWlzc2UpCgoKPGJsb2NrcXVvdGUgY2xhc3M9InR3aXR0ZXItdHdlZXQiIGRhdGEtbGFuZz0iZW4iPjxwIGxhbmc9ImVuIiBkaXI9Imx0ciI+RHJlYW1pbmcgb2YgYSBmYW5jeSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvUnN0YXRzP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jUnN0YXRzPC9hPiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvZ2dwbG90P3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jZ2dwbG90PC9hPiA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL2hhc2h0YWcvZGF0YXZpej9zcmM9aGFzaCZhbXA7cmVmX3NyYz10d3NyYyU1RXRmdyI+I2RhdGF2aXo8L2E+IGJ1dCBzdGlsbCBzY2FyZWQgb2YgdHlwaW5nIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vaGFzaHRhZy9jb2RlP3NyYz1oYXNoJmFtcDtyZWZfc3JjPXR3c3JjJTVFdGZ3Ij4jY29kZTwvYT4/IDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vX3B2aWN0b3JyP3JlZl9zcmM9dHdzcmMlNUV0ZnciPkBfcHZpY3RvcnI8L2E+IGVzcXVpc3NlIHBhY2thZ2UgaGFzIHlvdSBjb3ZlcmVkIDxhIGhyZWY9Imh0dHBzOi8vdC5jby8xdklEWGNWQUFGIj5odHRwczovL3QuY28vMXZJRFhjVkFBRjwvYT4gPGEgaHJlZj0iaHR0cHM6Ly90LmNvL1JsVGtwdG5yTnYiPnBpYy50d2l0dGVyLmNvbS9SbFRrcHRuck52PC9hPjwvcD4mbWRhc2g7IFJhZG9zbGF3IFBhbmN6YWsgKEBSUGFuY3phaykgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9SUGFuY3phay9zdGF0dXMvMTA0NzAxOTU4ODY1ODA0MDgzMj9yZWZfc3JjPXR3c3JjJTVFdGZ3Ij5PY3RvYmVyIDIsIDIwMTg8L2E+PC9ibG9ja3F1b3RlPgo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly9wbGF0Zm9ybS50d2l0dGVyLmNvbS93aWRnZXRzLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CgoKCgoKCgoKCgotLS0KCiMgUmNtZHIKCmBgYApsaWJyYXJ5KFJjbWRyKQoKUmNtZHI6OkNvbW1hbmRlcigpCgpgYGAKCgotIEEgQ29tcGFyYXRpdmUgUmV2aWV3IG9mIHRoZSBSIENvbW1hbmRlciBHVUkgZm9yIFIKCmh0dHA6Ly9yNHN0YXRzLmNvbS9hcnRpY2xlcy9zb2Z0d2FyZS1yZXZpZXdzL3ItY29tbWFuZGVyLwoKCi0tLQoKIyBqYW1vdmkKCmh0dHBzOi8vd3d3LmphbW92aS5vcmcvCgohWyFbXShodHRwczovL3d3dy5qYW1vdmkub3JnL2Fzc2V0cy9tYWluLXNjcmVlbnNob3QucG5nKV0oaHR0cHM6Ly93d3cuamFtb3ZpLm9yZy8pCgoKaHR0cHM6Ly9ibG9nLmphbW92aS5vcmcvMjAxOC8wNy8zMC9yai5odG1sCgohWyFbXShodHRwczovL2Jsb2cuamFtb3ZpLm9yZy9hc3NldHMvaW1hZ2VzL3JqLnBuZyldKGh0dHBzOi8vYmxvZy5qYW1vdmkub3JnLzIwMTgvMDcvMzAvcmouaHRtbCkKCi0tLQoKIyBTb25yYWtpIEtvbnVsYXIKCi0gUlN0dWRpbyBpbGUgR2l0SHViCi0gSGlwb3RleiB0ZXN0bGVyaQotIFIgTWFya2Rvd24gdmUgUiBOb3RlYm9vayBpbGUgdGVrcmFybGFuYWJpbGlyIHJhcG9yCgoKLS0tCgojIERpxJ9lciBrb2RsYXIKCi0gRGnEn2VyIGtvZGxhciBpw6dpbiBiYWvEsW7EsXo6IFtodHRwczovL3NiYWxjaS5naXRodWIuaW8vXShodHRwczovL3NiYWxjaS5naXRodWIuaW8vKQoKCi0tLQoKIyBHZXJpIEJpbGRpcmltCgotIEdlcmkgYmlsZGlyaW0gacOnaW4gdMSxa2xhecSxbsSxejogX1tHZXJpIGJpbGRpcmltIGZvcm11XShodHRwczovL2dvby5nbC9mb3Jtcy9ZakdaNURIZ3RQbFIxUm5CMylfCgoKLS0tCgo8c2NyaXB0IGlkPSJkc3EtY291bnQtc2NyIiBzcmM9Ii8vaHR0cHMtc2JhbGNpLWdpdGh1Yi1pby5kaXNxdXMuY29tL2NvdW50LmpzIiBhc3luYz48L3NjcmlwdD4KCjxkaXYgaWQ9ImRpc3F1c190aHJlYWQiPjwvZGl2Pgo8c2NyaXB0PgoKLyoqCiogIFJFQ09NTUVOREVEIENPTkZJR1VSQVRJT04gVkFSSUFCTEVTOiBFRElUIEFORCBVTkNPTU1FTlQgVEhFIFNFQ1RJT04gQkVMT1cgVE8gSU5TRVJUIERZTkFNSUMgVkFMVUVTIEZST00gWU9VUiBQTEFURk9STSBPUiBDTVMuCiogIExFQVJOIFdIWSBERUZJTklORyBUSEVTRSBWQVJJQUJMRVMgSVMgSU1QT1JUQU5UOiBodHRwczovL2Rpc3F1cy5jb20vYWRtaW4vdW5pdmVyc2FsY29kZS8jY29uZmlndXJhdGlvbi12YXJpYWJsZXMqLwovKgp2YXIgZGlzcXVzX2NvbmZpZyA9IGZ1bmN0aW9uICgpIHsKdGhpcy5wYWdlLnVybCA9IFBBR0VfVVJMOyAgLy8gUmVwbGFjZSBQQUdFX1VSTCB3aXRoIHlvdXIgcGFnZSdzIGNhbm9uaWNhbCBVUkwgdmFyaWFibGUKdGhpcy5wYWdlLmlkZW50aWZpZXIgPSBQQUdFX0lERU5USUZJRVI7IC8vIFJlcGxhY2UgUEFHRV9JREVOVElGSUVSIHdpdGggeW91ciBwYWdlJ3MgdW5pcXVlIGlkZW50aWZpZXIgdmFyaWFibGUKfTsKKi8KKGZ1bmN0aW9uKCkgeyAvLyBET04nVCBFRElUIEJFTE9XIFRISVMgTElORQp2YXIgZCA9IGRvY3VtZW50LCBzID0gZC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKcy5zcmMgPSAnaHR0cHM6Ly9odHRwcy1zYmFsY2ktZ2l0aHViLWlvLmRpc3F1cy5jb20vZW1iZWQuanMnOwpzLnNldEF0dHJpYnV0ZSgnZGF0YS10aW1lc3RhbXAnLCArbmV3IERhdGUoKSk7CihkLmhlYWQgfHwgZC5ib2R5KS5hcHBlbmRDaGlsZChzKTsKfSkoKTsKPC9zY3JpcHQ+Cjxub3NjcmlwdD5QbGVhc2UgZW5hYmxlIEphdmFTY3JpcHQgdG8gdmlldyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNxdXMuY29tLz9yZWZfbm9zY3JpcHQiPmNvbW1lbnRzIHBvd2VyZWQgYnkgRGlzcXVzLjwvYT48L25vc2NyaXB0PgoKLS0tCgoK